package com.sicau.agent;

import com.sicau.agent.model.AgentState;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;

/**
 * ReActAgent
 * 提供think和act两个步骤的代理抽象类
 */
@EqualsAndHashCode(callSuper = true)
@Data
@Slf4j
public abstract class ReActAgent extends BaseAgent{
    /**
     * 处理当前状态并决定下一步行动
     * @return 是否需要采取行动
     */
    protected abstract boolean think();

    /**
     * 采取实际的行动
     * @return 行动执行结果
     */
    protected abstract String act();

    @Override
    protected String step() {
        boolean thinkResult = think();
        try {
            if (thinkResult) {
                log.info("{}开始执行行动", getName());
                return act();
            } else {
                log.info("{}无需执行行动", getName());
                setAgentState(AgentState.FINISHED);
                return getChatResponse().getResult().getOutput().getText();
            }
        } catch (Exception e) {
            log.error("{}步骤执行失败！", getName(), e);
            setAgentState(AgentState.ERROR);
            return "步骤执行失败！" + e.getMessage();
        }
    }
}
